package edu.iscas.xcheck.analysis.handler;

import java.util.concurrent.Callable;

public class AnalysisWorker 
//implements Callable<AnalysisWorker.AnalysisWorkerResult>
{
//	private String logId;
//	private String testCaseId;
//	private String refBrowser = "CHROME_45";// "Chrome_44.0.2403.89";//"IE_11.0";//
//	private String[] testBrowsers;
//	
//	private AnalysisResult results;
//	
//	private static final Logger LOG = LoggerFactory
//			.getLogger(AnalysisWorker.class);
//
//	public AnalysisWorker(String logId) {
//		this.logId = logId;
//		results = new AnalysisResult();
//	}
//
//	public AnalysisWorker(String logId, String testcaseid, String refBrowser,
//			String[] testBrowsers) {
//		this.logId = logId;
//		this.testCaseId = testcaseid;
//		this.refBrowser = refBrowser;
//		this.testBrowsers = testBrowsers;
//		results = new AnalysisResult();
//		results.setTestCaseId(testcaseid);
//	}
//
//	public class AnalysisWorkerResult {
//		private String logId;
//		private boolean hasException;
//		private String exceptionString;
//
//		public String getLogId() {
//			return logId;
//		}
//
//		public void setLogId(String logId) {
//			this.logId = logId;
//		}
//
//		public boolean hasException() {
//			return hasException;
//		}
//
//		public void setHasException(boolean hasException) {
//			this.hasException = hasException;
//		}
//
//		public String getExceptionString() {
//			return exceptionString;
//		}
//
//		public void setExceptionString(String exceptionString) {
//			this.exceptionString = exceptionString;
//		}
//
//		public AnalysisWorkerResult(String logId, boolean hasException,
//				String exceptionString) {
//			super();
//			this.logId = logId;
//			this.hasException = hasException;
//			this.exceptionString = exceptionString;
//		}
//
//		@Override
//		public String toString() {
//			return "AnalysisWorkerResult [logId=" + logId + ", hasException="
//					+ hasException + ", exceptionString=" + exceptionString
//					+ "]";
//		}
//	}
//
//	public AnalysisWorkerResult call() {
//		try {
//			// 1: Get Replay Log from Server and load stateMap
//			LogResult logResult = loadReplayLog(logId);
//			StateEdgeUtil seUtil = loadStateMap(testCaseId);
//			
//			Map<String, List<BrowserPage>> browserMap = logResult
//					.getBrowserLogMap();
//			// 2: Data Preprocess for Lower browser
//			long start = new Date().getTime();
//			DataProcessor.processData(browserMap, seUtil);
//			// 3: Check
//			List<BrowserPage> refBrowserPages = browserMap.get(refBrowser);
//			checkTestBrowser(browserMap, refBrowser, refBrowserPages,
//					testBrowsers);
//			LOG.info("all:" + (new Date().getTime() - start));
//			Gson gson = new Gson();
//			System.out.println(gson.toJson(results));
//			return new AnalysisWorkerResult(logId, false, "");
//		} catch (Exception e) {
//			e.printStackTrace();
//			AnalysisWorkerResult result = new AnalysisWorkerResult(logId, true,
//					e.toString());
//			return result;
//		}
//	}
//
//	private void checkTestBrowser(Map<String, List<BrowserPage>> browserMap,
//			String refBrowserName, List<BrowserPage> refBrowserPages,
//			String[] testBrowserNames) {
//		for (String testBrowserName : testBrowserNames) {
//			for (String key : browserMap.keySet()) {
//				if (key.equals(refBrowser))
//					continue;
//				else if (key.equals(testBrowserName)) {
//					checkTwoBrowser(logId, refBrowserName, refBrowserPages,
//							key, browserMap.get(key));
//				}
//			}
//		}
//	}
//
//	private LogResult loadReplayLog(String logId) throws HttpException,
//			IOException {
//		Map<String, List<BrowserPage>> browserMap = new HashMap<String, List<BrowserPage>>();
//		String browser = "CHROME";
//		List<BrowserPage> browserPages = getLogFromServer(logId, browser);
//		if (browserPages != null && !browserPages.isEmpty()) {
//			Collections.sort(browserPages, new BrowserLogComparator());
//			browserMap.put(browserPages.get(0).getHash(), browserPages);
//		}
//		browser = "FIREFOX";
//		browserPages = getLogFromServer(logId, browser);
//		if (browserPages != null && !browserPages.isEmpty()) {
//			Collections.sort(browserPages, new BrowserLogComparator());
//			browserMap.put(browserPages.get(0).getHash(), browserPages);
//		}
//
//		LOG.debug(browserMap.keySet().toString());
//		// sort log by browser
//
//		// for (BrowserLog browserLog : browserLogs) {
//		// List<BrowserLog> browserLogs2 = browserMap
//		// .get(browserLog.getHash());
//		// if (browserLogs2 == null) {
//		// browserLogs2 = new ArrayList<BrowserLog>();
//		// browserMap.put(browserLog.getHash(), browserLogs2);
//		// }
//		// browserLogs2.add(browserLog);
//		// }
//		// // sort browser log by seq
//		// for (List<BrowserLog> browserLogList : browserMap.values()) {
//		// Collections.sort(browserLogList, new BrowserLogComparator());
//		// }
//
//		LogResult logResult = new LogResult();
//		logResult.setBrowserLogMap(browserMap);
//		return logResult;
//	}
//
//	private List<BrowserPage> getLogFromServer(String logId, String browser)
//			throws HttpException, IOException {
//		String url = InternalServerConfig.getServerAddr()
//				+ "/getRecordingForXBI?id=" + logId + "&browser=" + browser;
//		List<BrowserPage> browserLogs = null;
//		HttpClient httpClient = new HttpClient();
//		GetMethod getMethod = new GetMethod(url);
//
//		httpClient.executeMethod(getMethod);
//		if (getMethod.getStatusCode() == 200) {
//			InputStream inputStream = getMethod.getResponseBodyAsStream();
//			String contentString = getContentString(inputStream);
//			Gson gson = new Gson();
//			browserLogs = gson.fromJson(contentString,
//					new TypeToken<List<BrowserPage>>() {
//					}.getType());
//		}
//		return browserLogs;
//	}
//
//	private String getContentString(InputStream is) {
//		BufferedReader reader = new BufferedReader(new InputStreamReader(is));
//		StringBuilder sb = new StringBuilder();
//		String line = null;
//		try {
//			sb.append(reader.readLine());
//			while ((line = reader.readLine()) != null) {
//				sb.append("\n");
//				sb.append(line);
//			}
//		} catch (IOException e) {
//			e.printStackTrace();
//		} finally {
//			try {
//				is.close();
//			} catch (IOException e) {
//				e.printStackTrace();
//			}
//		}
//		return sb.toString();
//	}
//
//	private StateEdgeUtil loadStateMap(String testCaseId) throws HttpException,
//			IOException {
//		String url = InternalServerConfig.getServerAddr()
//				+ "/getStateEdgeList?testCaseId=" + testCaseId;
//		TestCaseStateEdge testCaseStateEdge = null;
//		HttpClient httpClient = new HttpClient();
//		GetMethod getMethod = new GetMethod(url);
//		httpClient.executeMethod(getMethod);
//		if (getMethod.getStatusCode() == 200) {
//			InputStream is = getMethod.getResponseBodyAsStream();
//			String contentString = getContentString(is);
//			Gson gson = new Gson();
//			testCaseStateEdge = gson.fromJson(contentString,
//					new TypeToken<TestCaseStateEdge>() {
//					}.getType());
//		}
//		StateEdgeUtil seUtil = new StateEdgeUtil();
//		if (null != testCaseStateEdge) {
//			for (StateEdge se : testCaseStateEdge.getStateEdgeList()) {
//				seUtil.pushStateEdge(se);
//			}
//		}
//		return seUtil;
//	}
//
//	public void putAnalysisResult() {
//		String url = InternalServerConfig.getServerAddr() + "/saveXBI";
//		try {
//			org.apache.http.client.HttpClient httpClient = HttpClientBuilder
//					.create().build();
//			HttpPost request = new HttpPost(url);
//			Gson gson = new Gson();
//			String rs = gson.toJson(results);
//			StringEntity s;
//			s = new StringEntity(rs);
//
//			s.setContentEncoding("UTF-8");
//			s.setContentType("application/json");
//			request.setEntity(s);
//			try {
//				HttpResponse response = httpClient.execute(request);
//				if (response.getStatusLine().getStatusCode() == 200) {
//					System.out.println("post success");
//				} else if (response.getStatusLine().getStatusCode() == 400) {
//					System.out.println("post fail");
//				}
//			} catch (ClientProtocolException e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//			} catch (IOException e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//			}
//		} catch (UnsupportedEncodingException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
//	}
//
//	/**
//	 * check two browser log and report diff issues
//	 * 
//	 * @param logId
//	 * @param refBrowserName
//	 * @param refBrowserPages
//	 * @param browserName
//	 * @param browserPages
//	 */
//	private void checkTwoBrowser(String logId, String refBrowserName,
//			List<BrowserPage> refBrowserPages, String browserName,
//			List<BrowserPage> browserPages) {
//		// check state
//		double start = new Date().getTime();
//		IsoChecker ic = new IsoChecker(new BrowserModel(refBrowserName,
//				refBrowserPages), new BrowserModel(browserName, browserPages));
//		ic.checkPages();
//		
//		XBIResult xbiResult = ic.getResults();
//		
//		List<StateIssue> siList = ic.getStateIssueList();
//		XBI xbi = new XBI();
//		xbi.setStateIssueList(siList);
//		xbi.setPlatform(browserName);
//		xbi.setSize(siList.size());
//		results.getXbi().add(xbi);
//		
//		LOG.info(String.valueOf(new Date().getTime() - start));
//
//		ErrorReporter er = new ErrorReporter(xbiResult);
//		er.save(DirInfo.getOutput() + logId, refBrowserName, browserName);
//	}
//
//	public static void main(String[] args) {
//		// AnalysisWorker analysisWorker = new
//		// AnalysisWorker("7402b1f7-663c-4212-96c1-4ae1c68a3fe0");
//		String[] t = new String[3];
//		t[0] = "FIREFOX_3";
//		t[1] = "CHROME_4";
//		t[2] = "IE";
//		AnalysisWorker analysisWorker = new AnalysisWorker(
//				"9cce3f4e-f1ca-4426-997b-3a5cb043cbf8",
//				"246c6cb0-591c-11e5-be80-c98669725361", "CHROME_4", t);
//		analysisWorker.call();
//	}
//	@Override
//	public String toString() {
//		return "AnalysisWorker [logId=" + logId + ", testCaseId=" + testCaseId + ", refBrowser=" + refBrowser
//				+ ", testBrowsers=" + Arrays.toString(testBrowsers) + "]";
//	}
}
